
package com.jf.cloud.order.service;

import com.jf.cloud.api.order.dto.FormExcelDTO;
import com.jf.cloud.api.order.vo.*;
import com.jf.cloud.api.user.bo.UserOrderStatisticBO;
import com.jf.cloud.api.user.bo.UserOrderStatisticListBO;
import com.jf.cloud.api.user.dto.MemberReqDTO;
import com.jf.cloud.api.user.vo.UserManagerVO;
import com.jf.cloud.common.database.dto.PageDTO;
import com.jf.cloud.common.database.vo.PageVO;
import com.jf.cloud.common.order.dto.OrderSearchDTO;
import com.jf.cloud.common.order.vo.OrderActivityVO;
import com.jf.cloud.common.order.vo.OrderCountVO;
import com.jf.cloud.common.order.vo.UserOrderStatisticVO;
import com.jf.cloud.order.vo.OrderOverviewVO;
import com.jf.cloud.order.vo.OrderRefundStatisticsVO;

import java.util.Collection;
import java.util.Date;
import java.util.List;

/**
 * @author zz
 */
public interface OrderStatisticsService {

    /**
     * 根据店铺id查询不同状态的订单数量
     * @param shopId
     * @return
     */
    OrderCountVO getOrderCountOfStatusByShopId(Long shopId);

    /**
     * 获取指定时间范围的退款订单比率信息及退款金额统计列表
     * @param shopId
     * @param dayCount
     * @param endTime
     * @return
     */
    List<OrderRefundStatisticsVO> listOrderRefundInfoInDateRange(Long shopId, Date endTime, Integer dayCount);

    /**
     * 根据指定时间范围获取根据商品名生成退款排行
     * @param shopId
     * @param endTime
     * @param dayCount
     * @return
     */
    List<OrderRefundStatisticsVO> listRefundRankingByProd(Long shopId, Date endTime, Integer dayCount);

    /**
     * 以小时分段获取当天订单实时统计数据
     * @param shopId
     * @param startTime
     * @param endTime
     * @return
     */
    OrderOverviewVO getToDayInfoByHour(Long shopId, Date startTime, Date endTime);

    /**
     * 根据shopId与时间范围获取当月订单的统计数据
     * @param shopId
     * @param startTime
     * @param endTime
     * @return
     */
    OrderOverviewVO getCurrentMonthByDay(Long shopId, Date startTime, Date endTime);

    /**
     * 根据退款原因生成退款排行
     * @param shopId
     * @param endTime
     * @param dayCount
     * @return
     */
    List<OrderRefundStatisticsVO> listRefundRankingByReason(Long shopId, Date endTime, int dayCount);

    /**
     * 获取当天与昨天订单实时统计数据
     * @param shopId
     * @return
     */
    OrderOverviewVO getDetailInfoByHour(Long shopId);

    /**
     * 根据订单数量生成商品排行
     * @param shopId 店铺ID
     * @param endTime 结束时间
     * @param dayCount 距离结束时间的天数
     * @param limit 排行榜取几条数据
     * @return
     */
    List<OrderOverviewVO> listSpuRankingByOrderCount(Long shopId, Date endTime, int dayCount, int limit);

    /**
     * 根据支付金额生成商品排行
     * @param endTime 结束时间
     * @param dayCount 距离结束时间的天数
     * @param limit 排行榜取几条数据
     * @return
     */
    List<OrderOverviewVO> listShopRankingByPayActual(Date endTime, int dayCount, int limit);

    /**
     * 获取店铺退款订单数量排行榜
     * @param endTime 结束时间
     * @param dayCount 距离结束时间的天数
     * @param limit 排行榜取几条数据
     * @return
     */
    List<OrderRefundStatisticsVO> listShopRankingByRefundCount(Date endTime, Integer dayCount, Integer limit);

    /**
     * 获取近多少天内的订单统计数据
     * @param shopId 店铺id
     * @param dayCount 天数
     * @return
     */
    OrderOverviewVO getOrderInfoByDayCountAndShopId(Long shopId, Integer dayCount);

    /**
     * 统计用户相关的订单信息
     * @param userIds
     * @param shopId
     * @return
     */
    List<UserOrderStatisticVO> countOrderByUserIds(List<Long> userIds, Long shopId);

    /**
     * 会员支付信息
     *
     * @param param 参数
     * @return 会员支付信息
     */
    UserOrderStatisticBO getPaidMemberByParam(MemberReqDTO param);

    /**
     * 获取新老会员成交数据
     *
     * @param param 筛选参数
     * @return 新老会员成交数据
     */
    UserOrderStatisticListBO getMemberPayData(MemberReqDTO param);

    /**
     * 付款用户列表
     * @param orderSearchDTO
     * @return
     */
    List<Long> getOrderUserIdsBySearchDTO(OrderSearchDTO orderSearchDTO);

    /**
     * 获取在一定时间内消费一定次数的会员信息
     *
     * @param isPayed      是否已支付
     * @param deleteStatus 用户订单删除状态，0：没有删除， 1：回收站， 2：永久删除
     * @param startDate    开始时间
     * @param endDate      结束时间
     * @param status       状态
     * @param minNum       最小数量
     * @param maxNum       最大数量
     * @return 会员id
     */
    List<Long> listUserIdByPurchaseNum(Integer isPayed, Integer deleteStatus, Date startDate, Date endDate, Integer status, Long minNum, Long maxNum);

    /**
     * 获取在一定时间内消费一定金额的会员信息
     * @param isPayed      是否已支付
     * @param deleteStatus 用户订单删除状态，0：没有删除， 1：回收站， 2：永久删除
     * @param startDate    开始时间
     * @param endDate      结束时间
     * @param status       状态
     * @param minAmount    最小支付金额
     * @param maxAmount    最大支付金额
     * @return 会员id
     */
    List<Long> listUserIdByAverageActualTotal(Integer isPayed, Integer deleteStatus, Date startDate, Date endDate, Integer status, Long minAmount, Long maxAmount);

    /**
     * 根据参数获取数据分析中的订单信息
     * @param spuIds 产品id列表
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 商品分析数据
     */
    List<OrderProdEffectRespVO> getProdEffectByDateAndProdIds(List<Long> spuIds, Date startTime, Date endTime);

    /**
     * 根据订单id列表， 获取订单流量信息列表
     * @param orderIds 订单id列表
     * @return 订单流量信息列表
     */
    List<FlowOrderVO> listFlowOrderByOrderIds(Collection<Long> orderIds);

    /**
     * 获取商品洞察的商品id
     * @param begin
     * @param size
     * @param shopId
     * @param startTime
     * @param endTime
     * @return
     */
    List<Long> getInsightSpuIdsByDate(Integer begin, Integer size, Long shopId, Date startTime, Date endTime);

    /**
     * 根据用户id列表获取积累消费金额和积累消费笔数
     * @param userIds 用户id列表
     * @return
     */
    List<SumAmountVO> listSumDataByUserIds(List<Long> userIds);

    /**
     * 获取用户购买过的商品数量
     * @param spuId 商品id
     * @param userId 分销员userId
     * @return
     */
    Long hasBuySuccessProd(Long spuId, Long userId);

    /**
     * 统计用户购物数据
     * @param userId 用户id
     * @return 用户购物数据
     */
    UserShoppingDataVO calculateUserInShopData(Long userId);

    /**
     * 获取活动销售的商品数量
     * @param activityIds
     * @param activityType
     * @return
     */
    List<OrderActivityVO> getActivitySalesQuantity(List<Long> activityIds, Integer activityType);

    /**
     * 统计活动订单的销量
     *
     * @param skuId
     * @param activityId
     * @param activityType
     * @return
     */
    Long countActivityOrderSale(Long skuId, Long activityId, Integer activityType);

    /**
     * 获取财务对账信息
     * @param startTime
     * @param endTime
     * @param shopName
     * @param shopId
     * @return
     */
    AccountOrderDetailVO getAccountOrderDetail(Date startTime, Date endTime, String shopName, Long shopId);

    /**
     * 获取店铺财务对账信息
     * @param startTime
     * @param endTime
     * @param shopName
     * @param pageSize
     * @param pageNum
     * @return
     */
    PageShopAccountOrderVO listShopAccountDetail(Date startTime, Date endTime, String shopName, Integer pageSize, Integer pageNum);

    /**
     * 获取店铺财务对账详情
     * @param startTime
     * @param endTime
     * @param shopId
     * @param shopName
     * @param pageSize
     * @param pageNum
     * @return
     */
    PageShopAccountOrderVO listOrderPayInfo(Date startTime, Date endTime, Long shopId, String shopName, Integer pageSize, Integer pageNum);

    /**
     * 获取时间范围内的销量排序，放入redis
     * @param key
     * @param shopId 店铺id
     * @param time 时间范围内
     * @param expireTime
     * @param esRenovationSpuSort
     */
    List<Long> addSoldNumRankCacheByShopIdAndTime(String key, Long shopId, Integer time, Integer expireTime, Integer esRenovationSpuSort, Long primaryCategoryId);

    /**
     * 获取团购活动信息
     * @param groupActivityId
     * @return
     */
    GroupInfoVO getGroupInfo(Long groupActivityId);

    /**
     * 获取报表信息
     * @param formExcelParamVO
     * @return
     */
    List<FormExcelDTO> listFormExcel(FormExcelParamVO formExcelParamVO);

    /**
     * 根据userIds和店铺id分页获取订单信息
     * @param userIds
     * @param shopId
     * @return
     */
    List<UserManagerVO> listOrderByUserIdsAndShopId(PageDTO pageDTO, List<Long> userIds, Long shopId, Integer sort);
}
